#include "ConnectWindow.hh"
#include "MainWindow.hh"
#include "../Network/XmlMessage.hh"

using namespace Gui;
using namespace Network;

/**
 * \brief Konstruktor.
 *
 * Betölti a ConnectWindow.ui file-ban megadott ablakot.
 */
ConnectWindow::ConnectWindow(QWidget *parent):
    QWidget(parent)
{
	ui.setupUi(this);
}

/**
 * \brief Szerverhez kapcsolódásért felelős slot.
 *
 * Csatlakozik a serverLine mezőben megadott szerverhez. A serverLine értéke a
 * [a-Z0-9_\-]+(:[0-9]+)? mintára kell, hogy illeszkedjen.
 */
void ConnectWindow::connect_button_handler() {
    QLineEdit const* const serverLine = findChild< QLineEdit* >("serverLine");
    QStringList const input =
      serverLine->text().split(":", QString::SkipEmptyParts);
    QString host = "localhost";
    uint16_t port = 55555;

    switch (input.size()) {
        case 0: break;

        case 1: {
            host = input.first();
            break;
        }

        case 2: {
            host = input.first();
            bool convOk;
            port = input.last().toUShort(&convOk);

            if (!convOk)
                throw;

            break;
        }

        default: throw;
    }

    emit connect_to_server(host, port);
}

/**
 * \brief Egy állapot esetén egy üzenetet megjelenítő case ág.
 * \param STATE   Az enum érték.
 * \param MESSAGE Az üzenet string.
 */
#define CASE(STATE, MESSAGE)        \
    case STATE:                     \
        label->setText(MESSAGE);    \
        break                       \

void ConnectWindow::client_state_changed(ClientState state) {
    QLabel* label = findChild< QLabel* >("stateLbl");

    switch (state) {
        CASE(START,                 "Kapcsolódva.");

        CASE(AUTHENTICATED,         "Bejelentkezve.");

        default:
            break;
    }
}

#undef CASE

/**
 * \brief Egy állapot esetén egy üzenetet megjelenítő case ág.
 * \param STATE   Az enum érték.
 * \param MESSAGE Az üzenet string.
 */
#define CASE(STATE, MESSAGE)        \
    case QAbstractSocket::STATE:    \
        label->setText(MESSAGE);    \
        break                       \


/**
 * \brief A socket állapotának megváltozását érzékelő slot.
 * \param state A socket új állapota.
 */
void ConnectWindow::socket_state_changed(QAbstractSocket::SocketState state) {
    QLabel* label = findChild< QLabel* >("stateLbl");

    switch (state) {
        CASE(UnconnectedState,  "Nincs kapcsolat.");
        CASE(HostLookupState,   "Szerver keresése...");
        CASE(ConnectingState,   "Kapcsolódás...");
        CASE(ConnectedState,    "Kapcsolódva.");
        CASE(BoundState,        "Várakozás kapcsolatra...");
        CASE(ClosingState,      "Kapcsolat lezárása...");
        CASE(ListeningState,    "Ismeretlen");
    }
}

/**
 * \brief A socket hibákat érzékelő slot.
 * \param error A hiba jellege.
 */
void ConnectWindow::socket_error(QAbstractSocket::SocketError error) {
    QLabel* label = findChild< QLabel* >("errorLbl");

    switch (error) {
        CASE(ConnectionRefusedError,            "Kapcsolat elutasítva.");
        CASE(RemoteHostClosedError,             "Kapcsolat lezárva.");
        CASE(HostNotFoundError,                 "A szerver nem található.");
        CASE(SocketAccessError,                 "Hozzáférés megtadadva.");
        CASE(SocketResourceError,               "Nincs szabad socket.");
        CASE(SocketTimeoutError,                "Időtúllépés.");
        CASE(DatagramTooLargeError,             "Túl nagy csomag.");
        CASE(NetworkError,                      "Hálózati hiba.");
        CASE(AddressInUseError,                 "Cím foglalt.");
        CASE(SocketAddressNotAvailableError,    "Érvénytelen cím.");
        CASE(UnsupportedSocketOperationError,   "Nem támogatott művelet.");
        CASE(ProxyAuthenticationRequiredError,  "Proxy autentikációs hiba.");
        CASE(SslHandshakeFailedError,           "SSL autentikációs hiba.");
        CASE(UnfinishedSocketOperationError,    "Befejezetlen művelet.");
        CASE(ProxyConnectionRefusedError,       "Proxy kapcsolat elutasítva.");
        CASE(ProxyConnectionClosedError,        "Proxy kapcsolat lezárva.");
        CASE(ProxyConnectionTimeoutError,       "Proxy időtúllépés.");
        CASE(ProxyNotFoundError,                "Proxy nem található.");
        CASE(ProxyProtocolError,                "Proxy protokoll hiba.");
        CASE(UnknownSocketError,                "Ismeretlen hiba.");
    }
}

#undef CASE


